/*
    8. Write a program in C to print all permutations of a given string using pointers.
    Expected Output :

    The permutations of the string are :                                                                         
    abcd  abdc  acbd  acdb  adcb  adbc  bacd  badc  bcad  bcda  bdca  bdac  cbad  cbda  cabd  cadb  cdab  cdba  
    dbca  dbac  dcba  dcab  dacb  dabc
*/

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b){
    char tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

int n = 0;
void perm(char *str, int start, int end){
    printf("%d\n", n++);
    int i;
    if(start == end){
        printf("%s  ", str);
    }else{
        for(i = start; i <= end; i++){      //全排列就是从第一个数字起每个数分别与它后面的数字交换
            swap((str + start), (str + i)); //1-将start元素与后面第i个元素进行交换
            printf("swap1 = %s\n", str);
            perm(str, start + 1, end);      //2-对剩下的元素再进行全排列
            swap((str + start), (str + i)); //3-恢复原来的排列，进行下一次排列（将start元素与后面第i+1个元素进行交换）
            printf("swap2 = %s\n", str);
        }
    }   
}

void perm2(char *str, int start, int end){
    int i;
    char tmp[25];
    if(start == end){
        printf("%s  ", str);
    }else{
        for(i = start; i <= end; i++){      //全排列就是从第一个数字起每个数分别与它后面的数字交换
            strcpy(tmp, str);
            swap((str + start), (str + i)); //1-将start元素与后面第i个元素进行交换
            perm2(str, start + 1, end);      //2-对剩下的元素再进行全排列
            strcpy(str, tmp); //3-恢复到原来的排列，进行下一次排列（将start元素与后面第i+1个元素进行交换）
            //swap((str + start), (str + i)); //3-恢复到原来的排列，进行下一次排列（将start元素与后面第i+1个元素进行交换）
        }
    }   
}

int main(void){
    char str[] = "abcd";
    printf("The permutations of the string are : \n");
    //perm(str, 0, strlen(str) - 1);
    perm2(str, 0, strlen(str) - 1);
    return 0;
}